'use strict';

// 第一题
function printStart(start) {
    // TODO 打印标签起始标签
    if (typeof start != "string") {
        // 如果不是个字符串，抛出异常
        throw "not a string";
    }
    document.write("<" + start + ">");
}

function printEnd(end) {
    // TODO 打印结束标签
    if (typeof end != "string") {
        // 如果不是个字符串，抛出异常
        throw "not a string";
    }
    document.write("</" + end + ">");
}

function printH1Title(title) {
    // TODO 打印标题
    document.write("<h1>" + title + "</h1>");
}

function leftTopPrint() {
    // TODO 打印左上角
    printH1Title("第一个九九乘法");
    printStart("table");
    for (let i = 1; i < 10; i++) {
        printStart("tr");
        for (let j = i; j < 10; j++) {
            document.write("<td>" + i + "*" + j + "=" + (i * j) + "</td>");
        }
        printEnd("tr");
    }
    printEnd("table");
    printStart("br");
}

function leftBottomPint() {
    // TODO 打印左下角
    printH1Title("第二个九九乘法");
    printStart("table");
    for (let i = 1; i < 10; i++) {
        printStart("tr");
        for (let j = 1; j <= i; j++) {
            document.write("<td>" + i + "*" + j + "=" + (i * j) + "</td>");
        }
        printEnd("tr");
    }
    printEnd("table");
}

function rightTopPrint() {
    // TODO 打印右上角
    printH1Title("第三个九九乘法表");
    printStart("table");
    for (let i = 1; i < 10; i++) {
        printStart("tr");
        for (let j = 0; j < i; j++) {
            document.write("<td style='border: none;'></td>");
        }
        for (let j = i; j < 10; j++) {
            document.write("<td>" + i + "*" + j + "=" + (i * j) + "</td>");
        }
        printEnd("tr");
    }
    printEnd("table");
}

function rightBottomPrint() {
    // TODO 打印右下角
    printH1Title("第四个九九乘法表");
    printStart("table");
    for (let i = 1; i < 10; i++) {
        printStart("tr");
        for (let j = 1; j < (10 - i); j++) {
            document.write("<td style='border: none;'></td>");
        }
        for (let j = i; j > 0; j--) {
            document.write("<td>" + i + "*" + j + "=" + (i * j) + "</td>");
        }
        printEnd("tr");
    }
    printEnd("table");
}

function myRandom(min, max) {
    // TODO 生成 [min,max]的随机数,包含min和max的值
    return parseInt(min + (Math.random() * (max - min + 1)));
}

// 第二题
function isCarmichaelNumbers(number) {
    // TODO 判断一个数是不是 卡迈克尔数
    let CarmichaelNumbers;
    // 卡迈尔克数 绝对伪素数
    /**
     * 561 1105 1729 2465 2821 6601 8911 10585 15841 29341 52633 41041 62745 46657 63973
     * @type {number[]}
     */
    CarmichaelNumbers = [561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841, 29341, 52633, 41041, 62745, 46657, 63973,];
    return CarmichaelNumbers.indexOf(number) !== -1;
    // 是 卡迈克尔数 返回 true，否则 返回 false

}

function isPrimeNumber(num) {
    // TODO 判断 一个数是不是素数
    if (isCarmichaelNumbers(num) === true) {
        return false;
    } else {
        /**
         * 113 = 素数(?)
         * 64^113 % 113 = 64
         * 29^113 % 113 = 29
         * 15^113 % 113 = 15
         *
         * 都成立则判断 113 是一个素数
         * @type {number}
         */
        let one = myRandom(1, num - 1);
        let two = myRandom(1, num - 1);
        let three = myRandom(1, num - 1);
        let flag = (getTheNumPowAndMod(one, num) === one)
            && (getTheNumPowAndMod(two, num) === two)
            && (getTheNumPowAndMod(three, num) === three);
        // console.log(num + " 是一个质数吗     " + flag + " " + one + " " + two + " " + three);
        return flag;
    }
}

function getTheNumPowAndMod(one, two) {
    // TODO 运算完返回 一个 number类型   one^two % two
    return new BigNumber(one).pow(two).mod(two).toNumber();
}

